// libs/common/src/utils/grpc-mapper.ts
import { plainToInstance } from 'class-transformer';

export class GrpcMapper {
  /**
   * 将 DTO 转换为 gRPC 消息
   */
  static toGrpc<T>(dto: any, GrpcMessage: any): T {
    const grpcMessage = new GrpcMessage();

    Object.keys(dto).forEach(key => {
      if (dto[key] !== undefined && dto[key] !== null) {
        grpcMessage[key] = dto[key];
      }
    });

    return grpcMessage;
  }

  /**
   * 从 gRPC 消息创建 DTO 实例
   */
  static fromGrpc<T>(grpcMessage: any, DtoClass: new () => T): T[] {
    // 如果 gRPC 消息有 toObject 方法，使用它
    const data = typeof grpcMessage.toObject === 'function'
      ? grpcMessage.toObject()
      : grpcMessage;

    return plainToInstance(DtoClass, data);
  }

  /**
   * 从 gRPC 响应创建 DTO 实例（处理 Observable/Promise）
   */
  static async fromGrpcResponse<T>(
    grpcResponse: any,
    DtoClass: new () => T
  ): Promise<T[]> {
    const response = await grpcResponse;
    return this.fromGrpc(response, DtoClass);
  }
}